package SocketBaseTest;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by yexuan on 2018/3/24.
 *  客户端
 通过查阅Socket对象，发现该对象建立时。就可以去连接指定主机。因为tcp是面向连接的，所以在建立Socket服务时，就要有服务端存在并连接成功。形成通路后在该通道进行数据的传输。
 步骤：
 1、创建socket服务，并指定连接的主机和端口。
 客户端需要明确服务器的ip地址以及端口，这样才可以去试着建立连接，如果连接失败，会出现异常。
 连接成功，说明客户端与服务端建立了通道，那么通过IO流就可以进行数据的传输，而Socket对象已经提供了输入流和输出流对象，通过getInputStream(),getOutputStream()获取即可。
 与服务端通讯结束后，关闭Socket。
 客户端：通过Socket建立对象并指定要连接的服务端主机以及端口。
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        //创建客户端的socket服务，制定目的主机和端口
        Socket s = new Socket("172.16.35.23",10001);
        //发送数据，获取输出流
        OutputStream os = s.getOutputStream();
        os.write("nihao!".getBytes());
//        s.close();

        InputStream is = s.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        s.close();

    }
}

/*
*  服务端需要明确它要处理的数据是从哪个端口进入的。
      当有客户端访问时，要明确是哪个客户端，可通过accept()获取已连接的客户端对象，并通过该对象与客户端通过IO流进行数据传输。
      当该客户端访问结束，关闭该客户端。
步骤：
1、建立服务端的Socket服务，ServerSocket()//绑定端口。
   并监听一个端口，(打上数字标识。)
2、获取连接过来的客户端对象。
   通过serverSocket的accept方法，没有连接就会等。所以这个方法是阻塞式的。
3、客户端如果发过来数据，那么服务端要使用对应的客户端对象，并获取到该客户端的读取流来读取发过来的数据。并打印在控制台上。
4、关闭服务端。（可选）
* */
class TcpServer{
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(10001);
        //通过accept获取客户端  accept阻塞方法
        Socket s = ss.accept();
        InputStream is = s.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(s.getInetAddress().getHostAddress()+".........."+new String(bytes,0,len));
//        while((len = is.read(bytes))!=-1){
//            String str = new String(bytes,0,len);
//            System.out.println(s.getInetAddress().getHostAddress()+".........."+str);
//        }

        OutputStream os = s.getOutputStream();
        os.write("收到了".getBytes());
        s.close();

        ss.close();
    }
}
